ui_kits/product/ · consumer: engineering (Django server-rendered templates, HTMX in places) · app layer over Logics CRMThe TP Prioritize wireframe is now the product kit (ui_kits/product/index.html). Its business logic is real — 25 working case statuses, 17 finalized per-year statuses, the per-year × return-type × jurisdiction status model, three tracking forms with validation and the bookkeeping points formula. Its visuals were a game of telephone: on ingestion the palette was remapped onto PTR tokens (theme + brand layers now load first and product.css maps the app vars onto them), but spacing, sizing, radii, border weights, and component shapes are still the wireframe's own. The old 5-component React kit and the Product Screen template were retired — the surface hands off as plain HTML/CSS.
| Decision | Ruling |
|---|---|
| Product name | PTR Tax Prep (matches the "PTR · Tax Prep" top bar). |
| Status taxonomy | The kit's 25 working (case-level) + 17 finalized (year-level) lists are canonical. The 8-status --case-* palette in tokens.json was a stand-in — retired from product use. The generated tokens stay untouched until the Figma source is re-exported with the real taxonomy. |
| Engineering target | Django server-rendered templates; HTMX in places. Deliverables are reference markup + documented CSS classes, not React components. |
| System of record | Logics CRM. FormStack / Intuit Link / Zapier / THS / DocuSign are older infrastructure this app leverages now and supersedes later. Case Status stays read-only from Logics. |
| Meta layer | Plan-notes panel, Spec'd/Extrapolated badges, E-xxx refs stay in — they are the handoff documentation. |
index.html (markup) / app.js (logic — treat as spec) / product.css (styles) so engineering can consume each independently.--color-primary/--ptr-green, cool greys → base scale, status families → the DaisyUI feedback pairs (success/info/warning/error) + secondary for business/review, fonts → Inter / Source Code Pro, radii vars → --radius-box/--radius-field.Shipped as ui_kits/product/reference.html + reference.css: every component of the two core views as copy-paste plain-HTML blocks with documented classes and all states enumerated — row (default / hover / overdue / starred / flagged / selected), status pills (both taxonomies, 8 tint/ink groups), doc-progress dots, scope chips, filter bar, quick tabs, group headers, empty states, the year/jurisdiction status table, cards, buttons, form fields.
.tp-row, .tp-pill, …) — the interactive app adopts the same names so specimen and app never drift. Done July 17: reference.css is the namespaced contract (mirrors their .og-* convention — confirmed in og_dashboard.css, ~150 app-prefixed classes)._case_row.html, _status_pill.html, …) and note the HTMX seams: filter bar swaps the list region, row click loads detail into the tab region, modals fetch as fragments. Done July 17 — partial map + seam contract in §6 of the specimen, matched to their partials/ vs components/ split and hx-get/hx-target/hx-swap="innerHTML" patterns from marketing_platform.input.css @source per app; "HTMX first, JS last" codified in their CLAUDE.md..tp-* onto DaisyUI per the specimen's §7 map; the interactive kit (index.html/product.css/app.js) adopts the surviving .tp-* names so specimen and app never drift.btn-style geometry — 2px borders on fields and buttons, radii 4/4/8, focus states from the theme.--fs-tiny 12 / --fs-small 14 / --fs-body 16); tabular numerics kept for IDs and money.--space-*; shadows onto --shadow-*; motion onto the Speed-Wins durations.package/brand.css (hand-authored block): tint/ink pairs per group (done / ready / pending / hold / stopped / info / business / review) following the badge-tint rule — then app.js color maps read tokens, not hexes; the .tp-pill component classes consuming them move to package/product.css (shared layer, v0.2).tokens.json update replacing the 8 stand-in case colors with the real taxonomy, then npm run build. Still open — the only Phase-2 item not shipped; the 8 group pairs live as a hand-authored block in brand.css until then.Shipped July 17: §7 collapse applied — buttons/fields/checkboxes are DaisyUI classes (btn / input / select / textarea / checkbox, previewed via ui_kits/product/daisy.css, a preview-only shim real builds drop); 2px field/button borders, 4/4/8 radii, primary focus states; type on 12/14/16 with tabular numerals (uppercase overlines kept at 10px behind a local --fs-micro alias — candidate token); spacing/shadows/motion on --space-* / --shadow-* / duration tokens. --case-{group}-bg/-fg promoted to package/brand.css; pills/empty/filter bar/toast ship from package/product.css (v0.2, in the exports map). The interactive kit adopted the surviving .tp-* names; app.js now emits group classes / token refs, never hex — the working-25 grouping is one re-mappable table (WORKING_GROUP, matches the specimen §1) pending E-001.7. Row checkboxes and form check-lines are real <input type="checkbox"> now (the §7 a11y fix). Statuses, validation and the points formula untouched. Addendum (responsive shell): ≤1240px case rows restructured (id | name | status | updated over debt | docs | fee; bulk-select hidden); ≤880px the sidebar becomes a slide-in drawer behind a hamburger (replaces the logo), brand + Plan notes drop, and the search — now uncapped at every width — fills the header. Drawer classes (.tp-menubtn, .rail-backdrop) are app-shell only, not part of the .tp-* specimen contract.
Goal: one cohesive platform, minimum app customization. Audit of the app's og_dashboard.css (~150 .og-* classes) found roughly 15% theme overrides (deleted by the package swap), 35% genuinely bespoke (leaderboard medals, sticky columns), 50% hand-built duplicates of DaisyUI capability (modals, toasts, chips, panel cards). The rule for Tax Prep — and the standard for every future surface:
btn / badge / modal / tabs / table / skeleton + theme tokens before any custom class.package/product.css — the deferred layer, revived as the shared layer in v0.2 — never copied per app.#e8e8e8/#1a1a1a — they'll stay Apple-gray after the PTR swap; flagged for the Phase-2 contrast pass.)Applied to this surface: reference.css now carries a per-class "collapses onto" map (§7 of the specimen) — the final .tp-* layer after Phase 2 is ~30 classes (case-row grid, year/jurisdiction table, doc dots, scope chips), not 150.
The three modals become server-rendered form specs — field list, types, required rules, conditional sections, error presentation — plus the HTMX interaction contract (open as fragment, inline validation, submit → toast + row refresh):
app.js (BK_PTS) are sample values, backend-configured.Shipped July 17: ui_kits/product/forms.html (§8 of the specimen set) — per-form field tables (name, type, required, conditional-on, error copy lifted verbatim from app.js), copy-paste modal markup on DaisyUI modal + native <dialog> (the §7 collapse, applied), and the HTMX contract: open as fragment → #tp-modal + showModal(); inline validation delayed-keyup where the codebase does it; submit → close + toast + owning-region swap (#tp-year-table + case row / transcripts card / bookkeeping card). Bookkeeping points recompute via a server round-trip (#bk-points-bar swap) — weights backend-configured. The interactive kit's three modals converted to the same <dialog> shells (wiring only; daisy.css shim gained modal/modal-box/modal-backdrop; Escape + backdrop close now native) — app.js statuses, validation and the points formula untouched. Suggested partials per §6 naming: _tracking_form / _handpull_form / _bk_form / _form_field / _bk_points_bar. Flagged, not resolved: E-004.1, E-004.6/.7, E-003.4.
Team Queue, Reports, Bookkeeping inventory, Awaiting Client, Starred/Flagged/Archive — built from the Phase 1/2 patterns once those settle. Team Queue and Reports also need real data (only Allen Rose's 16 of 47 cases exist in the wireframe; report targets are plan goals, not measurements).
Carried verbatim in the app's plan-notes panel; owners are business-side:
WORKING_TO_FINAL (one re-mappable table; raw value in the pill tooltip). Remaining: business sign-off on the 25→17 mapping.app.js — WORKING_TO_FINAL (the 25→17 display mapping behind every Overall TP pill) and WORKING_GROUP (the working-25 tint groups, now reference-only) — each is one re-mappable table. Phase 3 (forms → Django spec) shipped July 17 — Phase 4 (remaining views) is next up, gated in part by the Phase-5 decisions.